var _http = require("../utils/http.js");

// 从微信获取的code信息
var code = "";
// 全局变量的引用
var _app;
// 获取到的token信息
var token = "";
// 回调函数引用
var _callback;
//重新获取用户信息后是否需要回调
var needCallBack = true;
//初始化用户信息结束
var _isFinished = false;
//是否使用本地缓存
var _useStorage = false;
//正在加载数据
var _isLoading = false;
//是否发送过用户基本信息统计
var _hasSendStat = false;

/**
 * 初始化用户信息
 */
function init(value, back) {
  _app = value;
  _callback = back;
  _http.init(value);
  // checkStorage();
  // getCode();
}

/**
 * 先从本地缓存中读取登陆信息
 * 验证过期时间，因为涉及到取特殊值，所以必须要先登陆，
 * 并且token未过期的情况下才能获取
 */
function checkStorage() {
  var st = wx.getStorageSync("login");
  if (st) {
    if (needLogin(st["time"])) {  //token已过期
      getCode();
    } else {
      if (st["id"] && st["id"] != "") {
        _app.g.userInfo = st;
        _isFinished = true;
        _isLoading = false;
        doCallBack();
      } else {
        getCode();
      }
    }
  } else {
    getCode();
  }
}

/**
 * 根据存在本地的微信登陆过期时间判断是否需要重新登陆
 * @param value 需要对比的时间
 * 60000=1分钟
 */
function needLogin(value) {
  var temp = value - parseInt(new Date().getTime());
  if (temp < 60000) {
    return true;
  } else {
    return false;
  }
}

/**
 * 获取js_code
 */
function getCode() {
  _app.log("getCode");
  wx.login({
    success: function (res) {
      code = res.code //返回code
      _app.log(res, "getCode success");
      wxLogin();
    },
    fail: function (res) {
      _app.log(res, "getCode fail");
    }
  })
}

/**
 * 使用微信登陆
 */
function wxLogin() {
  _app.log("wxLogin");
  _http.request({
    url: _app.host + 'wxlogin',
    data: {
      "code": code,
    },
    method: 'get',
    header: {
      'content-type': '_application/json'
    },
    success: function (res) {
      _app.log(res.data, "wxLogin sucess");
      if (res.data.code == "100000") {
        _app.g.userInfo = res.data.data;
        _app.g.userInfo["time"] = (res.data.data["expires_in"]) * 1000 + parseInt((new Date().getTime()));
        wx.setStorageSync("login", _app.g.userInfo);
        _isLoading = false;
        _isFinished = true;
        setBaseUserInfo();
        doCallBack();
      } else {
        _isLoading = false;
        _isFinished = true;
        doCallBack();
      }
    },
    fail: function (res) {
      _isLoading = false;
      _isFinished = true;
      doCallBack();
      _app.log(res, "wxlogin fail");
    }
  })
}

/**
 * 获取基础用户信息
 */
function setBaseUserInfo() {
  _app.log("setBaseUserInfo");
  wx.getUserInfo({
    withCredentials: true,
    success: function (res) {
      _app.g.userInfo.encryptedData = res.encryptedData;
      _app.g.userInfo.iv = res.iv;
      _app.g.userInfo.userInfoAuth = true;
      for (var item in res.userInfo) {
        _app.g.userInfo[item] = res.userInfo[item];
      }
      register();
    },
    fail: function (res) {
      _app.g.userInfo.userInfoAuth = false;
    }
  })
}

/**
 * 补全在服务器端的用户信息
 */
function register() {
  _app.log("wx register");
  _http.request({
    url: _app.host + 'user/register',
    data: _app.g.userInfo,
    method: 'POST',
    success: function (res) {
      _app.log(res.data, "register success");
      if (res.data.code == "100000") {
        for (var item in res.data.data) {
          _app.g.userInfo[item] = res.data.data[item];
        }
        wx.setStorageSync("login", _app.g.userInfo);
      }
    },
    fail: function (res) {
      _app.log(res);
    }
  })
}


function registerBackFun(value) {
  needCallBack = true;
  _callback = value;
}

/**
 * 执行回调
 */
function doCallBack() {
  _callback();
}

/**
 * 检查当前token是否已经过期，如果过期重新请求
 */
function checkToken(backFun) {
  _callback = backFun;
  if (_app.g.userInfo && _app.g.userInfo["api_token"] && _app.g.userInfo["time"]) {
    if (needLogin(_app.g.userInfo["time"])) {
      getUserInfo();
    } else {
      doCallBack();
    }
  } else {
    getUserInfo();
  }
}


//获取用户信息
function getUserInfo() {
  _isLoading = true;
  if (_useStorage) {
    checkStorage();
  } else {
    getCode();
  }
}

/**
 * 验证用户基本信息类是否已经初始化完成
 */
function isFinish() {
  return _isFinished;
}

/**
 * 验证用户基本信息是否正在加载中
 */
function isLoading() {
  return _isLoading;
}

/**
 * 是否绑定过手机号
 */
function isBind() {
  return _app.g.userInfo.isBindMobile;
}

/**
 * 设置绑定手机号状态
 */
function setIsBind() {
  _app.g.userInfo.isBindMobile = true;
}

/**
 * 获取当前用户微信设置的所在地
 */
function getProvince() {
  return "";
  if (_app.g.userInfo.province && _app.g.userInfo.province != "") {
    return _app.g.userInfo.province;
  } else {
    return -1;
  }
}

/**
 * 更新用户信息
 */
function updataUserInfo(value) {
  register();
  for (var item in value) {
    _app.g.userInfo[item] = value[item];
  }
}


/**
 * 添加登录用户相关信息（lenovoID）
 * 如果只有id，标示接口请求过，但是数据错误
 */
function addLoginUserInfo(value) {
  if (!value) {
    value = {};
  }
  value.lenovoId = _app.g.userInfo.lenovoId;
  if (!_app.g.userInfo.vipInfo) {
    _app.g.userInfo.vipInfo = value;
  } else {
    for (var item in value) {
      _app.g.userInfo.vipInfo[item] = value[item];
    }
  }
}


/**
 * 获取当前用户类别
 * 0：普通微信用户（userid）
 * 1：登录用户
 */
function getUserType() {
  if (_app.g.userInfo && _app.g.userInfo.lenovoId && _app.g.userInfo.lenovoId != "") {
    return 1;
  } else {
    return 0;
  }
}

/**
 * 获取用户头像
 */
function getAvatar() {
  if (getUserType() == 0) {
    return _app.g.userInfo.avatar;
  } else {
    return _app.g.userInfo.vipInfo.avatar;
  }
}

/**
 * 获取昵称
 */
function getNickName() {
  if (getUserType() == 0) {
    return _app.g.userInfo.nickname;
  } else {
    return _app.g.userInfo.vipInfo.username;
  }
}

/**
 * 获取手机号
 */
function getPhone() {
  if (_app.g.userInfo.phoneNum && _app.g.userInfo.phoneNum != "") {
    return _app.g.userInfo.phoneNum;
  } else {
    return "";
  }
}

/**
 * 退出其它方式登录，改用微信账号体系
 */
function changeUserType() {
  if (_app.g.userInfo.lenovoId) {
    _app.g.userInfo.lenovoId = "";
    _app.g.userInfo.vipInfo = null;
  }
}

/**
 * 判断是否用户授权
 */
function getAuth() {
  if (_app.g.userInfo.userInfoAuth) {
    return _app.g.userInfo.userInfoAuth;
  } else {
    return false;
  }
}

function updateAuthor(value, needRegister = true) {
  for (var item in value) {
    _app.g.userInfo[item] = value[item];
  }
  _app.g.userInfo.userInfoAuth = true;
  if (needRegister) {
    register();
  }
}

module.exports = {
  init: init,
  registerBackFun: registerBackFun,
  _isFinished: isFinish,
  checkBaseInfo: checkToken,
  isLoading: isLoading,
  isBind: isBind,
  setIsBind: setIsBind,
  getProvince: getProvince,
  updateInfo: updataUserInfo,
  addLoginUserInfo: addLoginUserInfo,
  getUserType: getUserType,
  getAvatar: getAvatar,
  getNickName: getNickName,
  changeUserType: changeUserType,
  getPhone: getPhone,
  getAuth: getAuth,
  updateAuthor: updateAuthor
}